package produce;

public class MyStack {

    //属性
    private Object[] stack;
    //栈的元素个数
    private int len;
    //栈顶元素指针位置
    private  int index;

    //设置栈
    public MyStack(int len){
        //初始化栈的数组
        this.len = len;
        stack = new Object[len];
        //栈顶元素初始位置
        this.index = 0;
    }

    /**
     * 行为
     * 生产者
     * 入栈操作
     * object 被入栈的元素
     */

    public synchronized void push(Object object){
        //仓库满了
        if (index >= len){
            try {
                //生产者发现仓库满了，则主动进入等待队列，等待消费者消费
                this.wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }

        //入栈操作
        //存入元素
        stack[index] = object;
        //栈顶指针向上移动一个位置
        index++;
        //生产者生产产品之后，要通知消费者的等待队列，可以消费了
        this.notifyAll();
    }

    /**
     * 消费者
     * 出栈操作
     * pop 出栈的元素
     */

    public synchronized Object pop(){
        //仓库是空的
        if (index <=0){
            try {
                //如果消费者发现仓库是空的，则主动进入等待的状态
                this.wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }

        //栈顶指针指向下一个元素
        index--;
        //取出栈顶元素
        Object oject = stack[index];
        //清空栈顶元素
        stack[index] =null;
        //消费后，通知生产者继续生产
        this.notifyAll();
        return oject;

    }
}
